#include "udp_server.hpp"

using namespace std;
using namespace ns_server;

void usage(string proc)
{
    std::cout << "Usage:\n\t" << proc << " port\n" << std::endl;
}

// 数据处理1，将小写转换为大写
std::string transactionString(std::string request)
{
    std::string result;
    char c;
    for (auto &r : request)
    {
        if (islower(r))
        {
            c = toupper(r);
            result.push_back(c);
        }
        else
        {
            result.push_back(r);
        }
    }
    return result;
}

// 命令安全检查，用于数据处理2
static bool isPass(const std::string &command)
{
    bool pass = true;
    auto pos = command.find("rm");
    if(pos != std::string::npos)
    {
        pass = false;
    }
    return pass;
}
// 数据处理2：在服务器端执行客户端输入的命令
std::string excuteCommand(std::string command)
{
    // 1.命令检查
    if(!isPass(command))
    {
        return "Insufficient permissions!";
    }
    // 2.以命令行方式执行传入的字符串
    FILE* fp = popen(command.c_str(), "r");
    if(fp == nullptr)
    {
        return "None";
    }
    // 3.获取结果
    char line[1024];
    std::string result;
    while(fgets(line, sizeof(line), fp) != NULL)
    {
        result += line;
    }
    pclose(fp);

    return result;
}

// ./udp_server 8080
int main(int argc, char *argv[])
{
    if (argc != 2)
    {
        usage(argv[0]);
        exit(USAGE_ERR);
    }
    uint16_t port = atoi(argv[1]);
    //unique_ptr<UdpServer> usvr(new UdpServer(transactionString, port));
    //unique_ptr<UdpServer> usvr(new UdpServer(excuteCommand, port));
    unique_ptr<UdpServer> usvr(new UdpServer(port));

    //usvr->InitServer(); // 初始化服务器
    usvr->start();      // 启动服务器
    return 0;
}